L'ottimizzazione moderna è una collaborazione tra scelte algoritmiche di alto livello e consapevolezza delle caratteristiche hardware. Mentre Efficienza asintotica definisce i limiti teorici, mentre il Obbligo prestazionale esige che affrontiamo fattori costanti che i compilatori non possono risolvere da soli.
1. La gerarchia dell'ottimizzazione
Il successo segue un processo lineare: innanzitutto, elimina inefficienza asintotica (ad esempio, $O(N^2) \to O(N)$). Successivamente, affronta Blocchi all'ottimizzazione—principalmente Aliasing della memoria e il sovraccarico delle chiamate di procedura (come il controllo dei limiti costanti controllo dei limiti in get_vec_element).
2. Flusso di dati e vincoli
I compilatori sono cauti per motivi di sicurezza; non ottimizzeranno se un puntatore *dest potrebbe sovrapporsi al vettore data. Misuriamo la velocità nel mondo reale tramite Cicli per elemento (CPE). Le prestazioni sono spesso modellate con fattori di scala come $\alpha = 0.974$, dove il sovraccarico sposta la curva di esecuzione (ad esempio, $209/\alpha = 39.0$).
3. Realtà hardware
L'ottimizzazione richiede la comprensione del Unità di ritiro e del Percorso critico. Anche i cicli semplici sono limitati dal Limite di attraversamento delle unità funzionali o dal Limite di latenza dei percorsi dipendenti.